package es.uned.hoomgle.hibernate.daos.impl;
import java.util.List;

import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Repository;

import es.uned.hoomgle.hibernate.beans.impl.Home;
import es.uned.hoomgle.hibernate.beans.interfaces.HomeI;
import es.uned.hoomgle.hibernate.daos.interfaces.HomeDaoI;

@Repository(value="homeDao") //Soporte para escanear los daos sin tener que declararlos en el xml
//Y para la traduccion de excepciones.
/**
 * 
 * Clase gestora de las entidades de inmuebles
 *
 */
public class HomeDao extends HoomgleDao implements HomeDaoI {
	
	/**
	 * Transforma un objeto de negocio hogar en una entidad de hibernate
	 * @param dto
	 * @return
	 */
	public HomeI dtoToEntity (HomeI dto){
		Home home = new Home();
		BeanUtils.copyProperties(dto, home);
		
		return home;
	}
	
	/**
	 * Recupera la lista de casas que tenga algun valor relacionado con el argumento.
	 * 
	 * @param value
	 * @return
	 */
	public List<HomeI> search(String value){
		FullTextSession fullTextSession = Search.getFullTextSession(sessionFactory.getCurrentSession());			
		fullTextSession = Search.getFullTextSession(sessionFactory.getCurrentSession());
		List <HomeI>result;
		QueryBuilder qb = fullTextSession.getSearchFactory()
		    .buildQueryBuilder().forEntity( Home.class ).get();
		org.apache.lucene.search.Query query = qb
		  .keyword()
		  .onFields("city.name", "cost","area","city.state.name","hasGarden","description")
		  .matching(value)
		  .createQuery();
		// wrap Lucene query in a org.hibernate.Query
		org.hibernate.Query hibQuery = 
		    fullTextSession.createFullTextQuery(query, Home.class);
		// execute search
		result = hibQuery.list();
		return result;
	}
	
	/**
	 * Recupera la clase de la entidad con la que trabaja el dao
	 */
	public Class getEntityClass(){
		return Home.class;
	}

}
